package com.xibei.homepage.service.impl;

import com.xibei.homepage.CourseInfo;
import com.xibei.homepage.CourseInfosRequest;
import com.xibei.homepage.UserCourseRequest;
import com.xibei.homepage.UserInfo;
import com.xibei.homepage.client.CourseClient;
import com.xibei.homepage.dao.HomepageUserCourseDao;
import com.xibei.homepage.dao.HomepageUserDao;
import com.xibei.homepage.entity.HomepageUser;
import com.xibei.homepage.entity.HomepageUserCourse;
import com.xibei.homepage.service.IUserService;
import com.xibei.homepage.vo.CreateUserRequest;
import com.xibei.homepage.vo.UserCourseInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Slf4j
@Service
public class UserSeriveImpl implements IUserService {

    private final HomepageUserDao homepageUserDao;
    private final HomepageUserCourseDao homepageUserCourseDao;
    private final CourseClient courseClient;

    @Autowired
    public UserSeriveImpl(HomepageUserDao homepageUserDao,
                          HomepageUserCourseDao homepageUserCourseDao,
                          CourseClient courseClient) {
        this.homepageUserDao = homepageUserDao;
        this.homepageUserCourseDao = homepageUserCourseDao;
        this.courseClient = courseClient;
    }

    /**
     * 创建用户信息
     * 1、请求数据是否有效；
     * 2、判断是否存有用户信息;
     * @param request
     * @return
     */
    @Override
    public UserInfo createUser(CreateUserRequest request) {

        /**有效性检验*/
        if(!request.validate())
        {
            return UserInfo.invalid();
        }
        /**判断是否存在用户信息;
         * */
        HomepageUser oldUser = homepageUserDao.findByUsername(request.getUsername());
        if(oldUser != null) {
            return UserInfo.invalid();
        }
        /**当时为何要创建HomepageUser 构造函数,就在此处使用;
         * 1、id是系统自己产生,不用传递
         * 2、创建日期和修改日期也是系统产生，不用传递；
         * */
        HomepageUser newUser = homepageUserDao.save(new HomepageUser(request.getUsername(),request.getEmail()));
        /**
         * 返回UserInfo，其实是抽取出来公共的数据对象，以json格式展示，供API接口调用;
         */
        return new UserInfo(newUser.getId(),newUser.getUsername(),newUser.getEmail());
    }

    /**
     * 根据id获取用户信息：
     * Dao 返回的结果为：Optional
     * @param id
     * @return
     */
    @Override
    public UserInfo getUserInfo(Long id) {
        Optional<HomepageUser> user = homepageUserDao.findById(id);
        /***
         * 判断是否存,不存在返回无效对象;
         */
        if(!user.isPresent())
        {
            return UserInfo.invalid();
        }
        HomepageUser curUser = user.get();
        return new UserInfo(curUser.getId(),curUser.getUsername(),curUser.getEmail());
    }

    /**
     * 返回用户课程列表，用户与课程存在一对一或 一对多的关系，估中间需要使用集合;
     * 1、根据请求id从数据库表中获取实体类对象;
     * 2、判断用户实体类对象是否存在
     * 3、从实体类中获取裁剪的用户信息，即UserInfo；
     * 4、根据id获取实体类用户课程信息;
     * @param id
     * @return
     */
    @Override
    public UserCourseInfo getUserCourseInfo(Long id) {
        Optional<HomepageUser> user = homepageUserDao.findById(id);

        if(!user.isPresent())
        {
            return UserCourseInfo.invalid();
        }
        //从用户实体类中获取裁剪的用户信息：
        HomepageUser homepageUser = user.get();
        UserInfo userInfo = new UserInfo(homepageUser.getId(),homepageUser.getUsername(),homepageUser.getEmail());


        List<HomepageUserCourse> userCourses = homepageUserCourseDao.findByUserId(id);

        if(CollectionUtils.isEmpty(userCourses))
        {
            return new UserCourseInfo(userInfo,Collections.emptyList() );
        }

        List<CourseInfo> courseInfos = courseClient.getCourseInfos(
                new CourseInfosRequest(userCourses.stream()
                        .map(HomepageUserCourse::getCourseId)
                        .collect(Collectors.toList()))
        );
        return new UserCourseInfo(userInfo,courseInfos);
    }

    @Override
    public UserCourseInfo CreateUserCourseInfo(UserCourseRequest request)
    {
        HomepageUserCourse course1 = new HomepageUserCourse();
        course1.setUserId(request.getUserId());
        course1.setCourseId(request.getCourseId());


//        HomepageUserCourse course2 = new HomepageUserCourse();
//        course2.setUserId(7L);
//        course2.setCourseId(7L);

        HomepageUserCourse userCourse = homepageUserCourseDao.save(course1);

//        System.out.println(homepageUserCourseDao.saveAll(
//                Arrays.asList(course1, course2)
//        ).size());

        return getUserCourseInfo(request.getUserId());
    }
}
